
#ifndef TIANYU_COMMON_DELEGATE_H_
#define TIANYU_COMMON_DELEGATE_H_

#include <set>
#include "common_define.h"

class Delegate0
{
public:
	typedef void ( *Func )( );

	void operator( ) ( )
	{
		for( TFuncSet::iterator iter = func_set_.begin( ); iter != func_set_.end( ); ++iter )
		{
			Func func = *iter;
			if( func != NULL )
			{
				func( );
			}
		}
	}

	void operator += ( Func func )
	{	
		func_set_.insert( func );
	}

	void operator -= ( Func func )
	{
		func_set_.erase( func );
	}

private:
	typedef std::set< Func > TFuncSet;

	TFuncSet func_set_;
};

template< typename P1 >
class Delegate1
{
 public:
	typedef void ( *Func )( P1 p1 );

	void operator( ) ( P1 p1 )
	{
		for( typename TFuncSet::iterator iter = func_set_.begin( ); iter != func_set_.end( ); ++iter )
		{
			Func func = *iter;
			if( NULL != func )
			{
				func( p1 );
			}	
		}
	}

	void operator += ( Func func )
	{	
		func_set_.insert( func );
	}

	void operator -= ( Func func )
	{
		func_set_.erase( func );
	}

private:
	typedef std::set< Func > TFuncSet;

	TFuncSet func_set_;

};

template< typename P1, typename P2 >
class Delegate2
{
 public:
	typedef void ( *Func )( P1 p1, P2 p2 );

	void operator( ) ( P1 p1, P2 p2 )
	{
		for( typename TFuncSet::iterator iter = func_set_.begin( ); iter != func_set_.end( ); ++iter )
		{
			Func func = *iter;
			if( NULL != func )
			{
				func( p1, p2 );
			}	
		}
	}

	void operator += ( Func func )
	{	
		func_set_.insert( func );
	}

	void operator -= ( Func func )
	{
		func_set_.erase( func );
	}

private:
	typedef std::set< Func > TFuncSet;

	TFuncSet func_set_;

};

template< typename P1, typename P2, typename P3 >
class Delegate3
{
 public:
	typedef void ( *Func )( P1 p1, P2 p2, P3 p3 );

	void operator( ) ( P1 p1, P2 p2, P3 p3 )
	{
		for( typename TFuncSet::iterator iter = func_set_.begin( ); iter != func_set_.end( ); ++iter )
		{
			Func func = *iter;
			if( NULL != func )
			{
				func( p1, p2, p3 );
			}	
		}
	}

	void operator += ( Func func )
	{	
		func_set_.insert( func );
	}

	void operator -= ( Func func )
	{
		func_set_.erase( func );
	}

private:
	typedef std::set< Func > TFuncSet;

	TFuncSet func_set_;

};

template< typename P1, typename P2, typename P3, typename P4 >
class Delegate4
{
 public:
	typedef void ( *Func )( P1 p1, P2 p2, P3 p3, P4 p4 );

	void operator( ) ( P1 p1, P2 p2, P3 p3, P4 p4 )
	{
		for( typename TFuncSet::iterator iter = func_set_.begin( ); iter != func_set_.end( ); ++iter )
		{
			Func func = *iter;
			if( NULL != func )
			{
				func( p1, p2, p3, p4 );
			}	
		}
	}

	void operator += ( Func func )
	{	
		func_set_.insert( func );
	}

	void operator -= ( Func func )
	{
		func_set_.erase( func );
	}

private:
	typedef std::set< Func > TFuncSet;

	TFuncSet func_set_;

};

template< typename P1, typename P2, typename P3, typename P4, typename P5 >
class Delegate5
{
 public:
	typedef void ( *Func )( P1 p1, P2 p2, P3 p3, P4 p4, P5 p5 );

	void operator( ) ( P1 p1, P2 p2, P3 p3, P4 p4, P5 p5 )
	{
		for( typename TFuncSet::iterator iter = func_set_.begin( ); iter != func_set_.end( ); ++iter )
		{
			Func func = *iter;
			if( NULL != func )
			{
				func( p1, p2, p3, p4, p5 );
			}	
		}
	}

	void operator += ( Func func )
	{	
		func_set_.insert( func );
	}

	void operator -= ( Func func )
	{
		func_set_.erase( func );
	}

private:
	typedef std::set< Func > TFuncSet;

	TFuncSet func_set_;

};

#endif
